package persistentie;

import com.mysql.jdbc.PreparedStatement;
import domein.*;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;

/**
 *
 * @author Robin
 */
public class GebruikerMapper extends AbstractMapper<Integer, Gebruiker> {

    //SQL statements:
    private final static String LIJST_GEBRUIKERS = "SELECT * FROM gebruiker ORDER BY familienaam";
    private final static String LIJSTGEBRUIKERSZONDER = "SELECT voornaam, familienaam FROM gebruiker where gebruikerID<>? order by familienaam";
    private final static String GEEF_GEBRUIKER = "SELECT * FROM gebruiker WHERE gebruikerID=?";
    private final static String GEBRUIKER_TOEVOEGEN = "INSERT INTO gebruiker (voornaam, familienaam, wachtwoord) VALUES (?,?,MD5(?))";
    private final static String WACHTWOORD_GEBRUIKER = "SELECT wachtwoord FROM gebruiker WHERE gebruikerID=?";
    private final static String WIJZIG_GEBRUIKER = "UPDATE Gebruiker SET voornaam=?, familienaam=?, wachtwoord=md5(?) WHERE gebruikerID=?";
    private final static String VERWIJDER_GEBRUIKER1 = "DELETE FROM Webinar WHERE gebruikerID=?";
    private final static String VERWIJDER_GEBRUIKER2 = "DELETE FROM gebruiker WHERE gebruikerID=?";
    private final static String VERWIJDER_GEBRUIKER3 = "DELETE FROM webinarvolger WHERE gebruikerID=?";

    @Override
    public HashMap<Integer, Gebruiker> geefMap() {
        HashMap<Integer, Gebruiker> gebruikers = new HashMap<Integer, Gebruiker>();

        try {
            PreparedStatement ps = (PreparedStatement) DbConnection.getInstance().getConnection().prepareStatement(LIJST_GEBRUIKERS);
            ResultSet rs = ps.executeQuery();

            while (rs.next()) {
                int gebruikerID = rs.getInt("gebruikerID");
                String voornaam = rs.getString("voornaam");
                String familienaam = rs.getString("familienaam");
                String wachtwoord = rs.getString("wachtwoord");

                Gebruiker g = new Gebruiker(gebruikerID, voornaam, familienaam, wachtwoord);
                gebruikers.put(Integer.valueOf(gebruikerID), g);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return gebruikers;
    }

    @Override
    public Gebruiker geefGebruiker(int gebruikerID) {
        Gebruiker g = null;
        try {
            PreparedStatement ps = (PreparedStatement) DbConnection.getInstance().getConnection().prepareStatement(GEEF_GEBRUIKER);
            ps.setInt(1, gebruikerID);
            ResultSet rs = ps.executeQuery();

            while (rs.next()) {

                String voornaam = rs.getString("voornaam");
                String familienaam = rs.getString("familienaam");
                String wachtwoord = rs.getString("wachtwoord");

                g = new Gebruiker(gebruikerID, voornaam, familienaam, wachtwoord);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return g;
    }

    @Override
    public void voegGebruikerToe(Gebruiker gebruiker) {
        try {
            PreparedStatement ps = (PreparedStatement) DbConnection.getInstance().getConnection().prepareStatement(GEBRUIKER_TOEVOEGEN);
            ps.setString(1, gebruiker.getVoornaam());
            ps.setString(2, gebruiker.getFamilienaam());
            ps.setString(3, gebruiker.getWachtwoord());
            ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void wijzigGebruiker(Gebruiker g) {
        try {
            PreparedStatement ps = (PreparedStatement) DbConnection.getInstance().getConnection().prepareStatement(WIJZIG_GEBRUIKER);
            ps.setString(1, g.getVoornaam());
            ps.setString(2, g.getFamilienaam());
            ps.setString(3, g.getWachtwoord());
            ps.setInt(4, g.getGebruikerID());
            ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void verwijderGebruiker(int gid) {
        try {
            PreparedStatement ps = (PreparedStatement) DbConnection.getInstance().getConnection().prepareStatement(VERWIJDER_GEBRUIKER1);
            ps.setInt(1, gid);
            ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            PreparedStatement ps = (PreparedStatement) DbConnection.getInstance().getConnection().prepareStatement(VERWIJDER_GEBRUIKER2);
            ps.setInt(1, gid);
            ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            PreparedStatement ps = (PreparedStatement) DbConnection.getInstance().getConnection().prepareStatement(VERWIJDER_GEBRUIKER3);
            ps.setInt(1, gid);
            ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public String geefWachtwoordGebruiker(int gebruikerID) {
        String ww = null;
        try {
            PreparedStatement ps = (PreparedStatement) DbConnection.getInstance().getConnection().prepareStatement(WACHTWOORD_GEBRUIKER);
            ps.setInt(1, gebruikerID);
            ResultSet rs = ps.executeQuery();

            while (rs.next()) {

                String wachtwoord = rs.getString("wachtwoord");
                ww = wachtwoord;
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return ww;
    }

    @Override
    public ArrayList<String> geefAlleGebruikers(int gid) {
        ArrayList<String> gebruikers = new ArrayList<String>();
        try {
            PreparedStatement ps = (PreparedStatement) DbConnection.getInstance().getConnection().prepareStatement(LIJSTGEBRUIKERSZONDER);
            ps.setInt(1, gid);
            ResultSet rs = ps.executeQuery();

            while (rs.next()) {
                String voornaam = rs.getString("voornaam");
                String achternaam = rs.getString("familienaam");
                gebruikers.add(voornaam + " " + achternaam);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return gebruikers;
    }
}
